"""
重点：题意转换。把「最多可以把 K 个 0 变成 1，求仅包含 1 的最长子数组的长度」转换为 「找出一个最长的子数组，该子数组内最多允许有 K 个 0 」。

1. 扩大窗口时，只需要更新window
2. 窗口中0的次数==k时候，开始停止扩大窗口
3. 缩小窗口时，只需要更新window
4. 缩减窗口后，更新结果
"""

import collections

class Solution:
    def longestOnes(self, nums: List[int], k: int) -> int:
        window = collections.defaultdict(int)
        
        left, right = 0, 0
        res = 0
        
        while right < len(nums):
            c = nums[right]
            
            window[c] += 1
            
            right += 1
            
            while window[0] > k:
                d = nums[left]
                
                window[d] -= 1
                
                left += 1
            
            res = max(res, right - left)
        return res